package client

import (
	"day25/block"
	"day25/tools"
	"flag"
	"fmt"
	"os"
)

/**
 ** @author: hui
 ** @email: 3231954428@qq.com
 ** @phone: 15779563913
 ** @DataTime: 2022/4/8 12:39
 **/

//判断区块链是否存在
func exit() bool{
	fileExit := tools.FileExit("./chain.db")
	if fileExit{
		return true
	} else {
		return false
	}
}

/**
	功能1
	创建一个带有创世区块的区块链  参数：1  创世区块的交易信息
	main.exe createchain --data "jskhdjk"
 */
func (cl *Cl) NewBlockChain(){
	//获取用户信息
	args := os.Args
	NewBlockChain := flag.NewFlagSet("NewBlockChain", flag.ExitOnError)

	data := NewBlockChain.String("data", "", "创世区块的交易信息")
	NewBlockChain.Parse(args[2 : ])
	//判断区块链是否存在
	if !exit(){
		fmt.Println("区块链已存在")
		return
	}
	chain, err := block.NewBlockChain([]byte(*data))
	defer chain.DB.Close()
	if err != nil{
		fmt.Println(err.Error())
		return
	}
	fmt.Println("区块链创建成功")
}

/**
	功能2
	向区块链中添加新区块  参数：1   新区块的交易信息
	main.exe addblock --data "sewe"
 */
func (cl *Cl) AddBlock(){
	//获取用户信息
	args := os.Args
	//把方法设置成命令
	AddBlock := flag.NewFlagSet("AddBlock", flag.ExitOnError)
	//判断区块链是否存在

	if !exit(){
		fmt.Println("区块链不存在,请先创建区块链")
		return
	}
	//创建区块链
	chain, err := block.NewBlockChain(nil)
	defer chain.DB.Close()
	if err != nil{
		fmt.Println(err.Error())
		return
	}
	data := AddBlock.String("data", "", "新区块的交易信息")
	AddBlock.Parse(args[2 : ])
	err = chain.AddBlock([]byte(*data))
	if err != nil{
		fmt.Println("添加失败")
		return
	}
	fmt.Println("添加成功")
}

/**
	功能3
	查看区块链中所有区块的信息
	main.exe printblock 参数 ：无
 */
func(cl *Cl) printblock(){
	//判断区块链是否存在
	if !exit(){
		fmt.Println("区块链不存在,请先创建区块链")
		return
	}
	//创建区块链
	chain, err := block.NewBlockChain(nil)
	defer chain.DB.Close()
	if err != nil{
		fmt.Println(err.Error())
		return
	}
	allBlock := chain.GetAllBlock()
	for _,value:=range allBlock{
		//区块的hash值和data
		fmt.Printf("hash:%x,data:%s\n",value.Hash,value.Data)
	}
}

/**
	功能4
	获取区块链中区块的个数  参数: 无
		main.exe getblockcount
 */
func (cl *Cl) getblockcount(){
	//判断区块链是否存在
	if !exit(){
		fmt.Println("区块链不存在,请先创建区块链")
		return
	}
	//创建区块链
	chain, err := block.NewBlockChain(nil)
	defer chain.DB.Close()
	if err != nil{
		fmt.Println(err.Error())
		return
	}
	allBlock := chain.GetAllBlock()
	fmt.Println(len(allBlock))
}

/**
	功能5
	输出当前系统的使用说明 参数：无
	main.exe help
 */
func (cl *Cl) Help(){
	fmt.Println("main.exe NewBlockChain --data '创世区块的交易信息'")
	fmt.Println("main.exe AddBlock --data '新区块的交易信息'")
	fmt.Println("main.exe printblock")
	fmt.Println("main.exe getblockcount")
}